package com.example.week12;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class HttpURLConnectionActivity extends AppCompatActivity {

    //定义组件
    TextView showTextView = null;
    ImageView showImageView = null;
    String resultStr = "";
    ProgressBar progressBar = null;
    ViewGroup viewGroup = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_http_urlconnection);

        //初始化组件
        showTextView = findViewById(R.id.textview_show);
        showImageView = findViewById(R.id.imagview_show);

        //点击查看网页的按钮时的事件监听
        findViewById(R.id.btn_visit_web).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 设置用于显示图片的 View 不可见，显示网页的 View 可见
                showImageView.setVisibility(View.GONE);
                showTextView.setVisibility(View.VISIBLE);
                //创建获得网页内容的新线程，该线程会将网页的 HTML 代码存入 resultStr
                //下载的细节在自定义类 VisitWebRunnable 中，见后面的定义
                Thread visitBaiduThread = new Thread(new VisitWebRunnable());
                //启动新线程
                visitBaiduThread.start();
                //线程执行完后，在文本框中显示网页源代码
                try {
                    //线程的 join()方法会挂起调⽤线程，直到被调⽤线程结束执⾏，调⽤线程才会继续执⾏
                    visitBaiduThread.join();
                    //将在线程中获得的页面内容放在文本框中
                    if(!resultStr.equals("")){
                        showTextView.setText(resultStr);
                    }
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });

        //点击“下载图片”按钮时的事件监听
        findViewById(R.id.btn_download_img).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 设置用于显示图片的 View 可见，显示网页的 View 不可见
                showImageView.setVisibility(View.VISIBLE);
                showTextView.setVisibility(View.GONE);
                //设置图片的 URL
                String imgUrl =
                        "http://p3.itc.cn/q_70/images03/20200710/a31a2a2fb5434a438e39b443a53dca37.jpeg";
                //用自定义的异步任务类来下载和显示图片(见后面的定义)
                new DownImgAsyncTask().execute(imgUrl);
            }
        });
    }

    //自定义类，内含新线程连接 HttpURL 获得网页
    class VisitWebRunnable implements Runnable{
        @Override
        public void run() {
            HttpURLConnection conn = null; //连接对象
            InputStream is = null; //输入流
            String resultData = ""; //
            try {
                //建立连接对象并设置属性
                URL url = new URL("https://m.baidu.com/"); //URL 对象
                conn = (HttpURLConnection)url.openConnection(); //使用 URL 打开一个链接
                conn.setDoInput(true); //允许输入流，即允许下载
                conn.setDoOutput(true); //允许输出流，即允许上传
                conn.setUseCaches(false); //不使用缓冲
                conn.setRequestMethod("GET"); //使用 get 请求
                //获取输入流，此时才真正建立链接
                is = conn.getInputStream();
                InputStreamReader isr = new InputStreamReader(is);
                //建立输入缓冲区
                BufferedReader bufferReader = new BufferedReader(isr);
                //完成页面 HTML 源文档的读取
                String inputLine = "";
                while((inputLine = bufferReader.readLine()) != null){
                    resultData += inputLine + "\n";
                }
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally{
                if(is != null){
                    try {
                        is.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                if(conn != null){
                    conn.disconnect();
                }
            }
            //将在线程内获得的结果保存在 HttpURLConnectionActivity 中的属性（返回值的方法）
            resultStr = resultData;
        }
    }
    //定义用于下载和显示图片的类
    //下载图片是个耗时操作，AsyncTask 类是 Android 提供的轻量级的异步类，在类中实现异步操作
    //相比直接启动新线程的方案，继承 AsyncTask 类的方案更清晰、更简洁
    class DownImgAsyncTask extends AsyncTask<String, Void, Bitmap> {
        //任务开始前执行
        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
            showImageView.setImageBitmap(null);
            //显示进度条提示框，当网络慢时，会看见转圈的图符(见后面的定义)
            showProgressBar();
        }
        //任务开始后在后台执行的操作
        @Override
        protected Bitmap doInBackground(String... params) {
            // TODO Auto-generated method stub
            URL imgUrl = null;
            Bitmap bitmap = null;
            try {
                //用传递进入的参数构造 URL 对象
                imgUrl = new URL(params[0]);
                //建立连接
                HttpURLConnection conn = (HttpURLConnection)imgUrl.openConnection();
                conn.setDoInput(true);
                conn.connect();
                //获得输入流
                InputStream is = conn.getInputStream();
                //用输入流构造图片对象
                bitmap = BitmapFactory.decodeStream(is);
                is.close();
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }catch(IOException e){
                e.printStackTrace();
            }
            //返回图片对象
            return bitmap;
        }
        //任务完成时执行
        @Override
        protected void onPostExecute(Bitmap result) {
            super.onPostExecute(result);
            //若得到的结果非空
            if(result!=null){
                //隐藏进度条（不再转圈圈了，见后面的定义）
                dismissProgressBar();
                //显示得到的图片
                showImageView.setImageBitmap(result);
            }
        }
    }
    //在母布局中间显示进度条
    private void showProgressBar(){
        progressBar = new ProgressBar(this, null, android.R.attr.progressBarStyleLarge);
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT);
        params.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
        progressBar.setVisibility(View.VISIBLE);
        Context context = getApplicationContext();
        viewGroup = (ViewGroup)findViewById(R.id.parent_view);
        viewGroup.addView(progressBar, params);
    }

    // 隐藏进度条
    private void dismissProgressBar(){
        if(progressBar != null){
            progressBar.setVisibility(View.GONE);
            viewGroup.removeView(progressBar);
            progressBar = null;
        }
    }
}